package com.controller;

import com.google.gson.Gson;
import com.pojo.Enterprise;
import com.pojo.User;
import com.service.IEnterpriseService;
import com.service.IUserService;
import com.service.impl.EnterpriseServiceImpl;
import com.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 企业信息控制器
 处理所有以 "/enterprise/*" 开头的请求
 */
@WebServlet("/enterprise/*")
public class EnterpriseController extends HttpServlet {
    // 企业服务接口实现类对象，用于处理企业相关业务逻辑
    private IEnterpriseService ies = new EnterpriseServiceImpl();
    // 用户服务接口实现类对象，用于处理用户相关业务逻辑
    private IUserService ius = new UserServiceImpl();

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String requestURI = request.getRequestURI();
        int index = requestURI.lastIndexOf("/") + 1;
        String methodName = requestURI.substring(index);

        // 设置响应头
        response.setContentType("application/json;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        try {
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(this, request, response);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
            response.getWriter().println(new Gson().toJson("方法不存在或调用失败"));
        }
    }
    
    /**
     * 处理企业信息认证提交请求
     * 功能：接收前端提交的企业信息，进行验证后保存到数据库，并关联当前用户
     */
    public void submitEnterpriseInfo(HttpServletRequest request, HttpServletResponse response) throws IOException {
        try {
            // 从session中获取当前用户账号
            // 说明：系统在用户登录时会将账号存入 session 的 "loginUser" 属性中,用loginUser拿到account
            String account = (String) request.getSession().getAttribute("loginUser");
            // 检查用户是否登录
            if (account == null) {
                // 未登录状态，返回错误信息
                response.getWriter().println(new Gson().toJson("用户未登录，请先登录"));
                return;
            }
            
            //根据账号查询用户信息，验证用户是否存在
            User user = ius.getUserByAccount(account);
            if (user == null) {
                // 用户不存在，返回错误信息
                response.getWriter().println(new Gson().toJson("用户不存在"));
                return;
            }
            // 检查用户是否已关联企业（enterpriseId 不为空表示已关联）
            if (user.getEnterpriseId() != null) {
                // 已关联企业，返回错误信息，防止重复提交
                response.getWriter().println(new Gson().toJson("该用户已关联企业，无法重复提交"));
                return;
            }
            
            // 获取提交的企业信息
            String name = request.getParameter("name");// 企业名称
            String socialUniformCode = request.getParameter("socialUniformCode");// 统一社会信用代码
            String scale = request.getParameter("scale");// 企业规模
            String email = request.getParameter("email");// 企业邮箱
            String phone = request.getParameter("phone");// 联系电话
            String fax = request.getParameter("fax");// 传真（可为空）
            String address = request.getParameter("address"); // 企业地址
            
            // 基本参数校验，检查必填项是否为空
            if (name == null || name.trim().isEmpty() ||
                socialUniformCode == null || socialUniformCode.trim().isEmpty() ||
                scale == null || scale.trim().isEmpty() ||
                email == null || email.trim().isEmpty() ||
                phone == null || phone.trim().isEmpty() ||
                address == null || address.trim().isEmpty()) {
                response.getWriter().println(new Gson().toJson("企业信息不完整，请检查必填项"));
                return;
            }
            // 参数处理：去除首尾空格，并对特定字段进行格式化
            name = name.trim();
            socialUniformCode = socialUniformCode.trim().toUpperCase();
            scale = scale.trim();
            email = email.trim().toLowerCase();
            phone = phone.trim();
            fax = fax != null ? fax.trim() : "";
            address = address.trim();

            // 企业信息查重：检查企业名称和统一社会信用代码是否已存在
            if (ies.checkEnterpriseExist(name, socialUniformCode)) {
                // 已存在相同企业信息，返回错误信息
                response.getWriter().println(new Gson().toJson("企业名称或统一社会信用代码已存在，每家企业只能认证一次"));
                return;
            }
            
            //  创建企业对象，并设置属性值
            Enterprise enterprise = new Enterprise();
            enterprise.setName(name);
            enterprise.setSocialUniformCode(socialUniformCode);
            enterprise.setScale(scale);
            enterprise.setEmail(email);
            enterprise.setPhone(phone);
            enterprise.setFax(fax);
            enterprise.setAddress(address);
            
            //调用服务层方法，将企业信息保存到数据库
            boolean addSuccess = ies.addEnterprise(enterprise);
            // 检查保存是否成功
            if (!addSuccess) {
                response.getWriter().println(new Gson().toJson("企业信息保存失败，请稍后重试"));
                return;
            }
            
            // 获取新添加的企业（通过查询刚刚添加的企业）
            Enterprise savedEnterprise = ies.getEnterpriseByNameAndCode(name, socialUniformCode);
            
            if (savedEnterprise == null) {
                response.getWriter().println(new Gson().toJson("企业信息保存失败，请稍后重试"));
                return;
            }
            
            //  更新用户表，将用户与企业关联（设置用户的 enterpriseId 和 enterpriseName）
            boolean updateSuccess = ius.updateUserEnterprise(account, savedEnterprise.getId(), savedEnterprise.getName());
            // 根据关联结果返回相应信息
            if (updateSuccess) {
                response.getWriter().println(new Gson().toJson("企业信息提交成功，认证完成"));
            } else {
                response.getWriter().println(new Gson().toJson("企业信息保存成功，但关联用户失败，请联系管理员"));
            }
            
        } catch (Exception e) {
            // 捕获所有异常，打印堆栈信息用于调试
            e.printStackTrace();
            // 向客户端返回包含异常信息的错误响应
            response.getWriter().println(new Gson().toJson("提交失败：" + e.getMessage()));
        }
    }
}